/**
 * @description: 字母大写转小写
 * @param {string} str
 * @return {*}
 */
export const stringToLowerCase = (str: string) => {
  if (/[a-zA-Z]/.test(str)) {
    return str.toLowerCase();
  }
  return str;
};

/**
 * 千分位转换
 */
export function formatNumToTh(num: string | number = 0, unit?: string, preUnit?: string) {
  // 处理字符串或数字，移除可能存在的原有逗号
  const numStr = String(num).replace(/,/g, "");

  // 分割整数和小数部分
  const parts = numStr.split(".");
  let integerPart = parts[0];
  const decimalPart = parts.length > 1 ? `.${parts[1]}` : "";

  // 为整数部分添加千分位逗号
  integerPart = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  return (preUnit || "") + (integerPart + decimalPart) + (unit || "");
}

/**
 * 防抖函数（Debounce）
 * @param fn - 要执行的函数
 * @param delay - 延迟时间（毫秒）
 * @param immediate - 是否立即执行（默认 false）
 * @returns 防抖后的函数
 */
export function debounce<T extends (...args: any[]) => any>(fn: T, delay: number = 300, immediate: boolean = false): (...args: Parameters<T>) => void {
  let timer: ReturnType<typeof setTimeout> | null = null;

  return function (this: ThisParameterType<T>, ...args: Parameters<T>) {
    if (timer) clearTimeout(timer);

    // 立即执行模式（首次触发时执行）
    if (immediate && !timer) {
      fn.apply(this, args);
    }

    timer = setTimeout(() => {
      if (!immediate) {
        fn.apply(this, args);
      }
      timer = null;
    }, delay);
  };
}
